import greenfoot.*;  // (World, Actor, GreenfootImage, Greenfoot and MouseInfo)
import java.util.Random;

/**
 * Representa la clase Pinvuino,
 * la cual se usa para crea el
 * objeto pinguino.
 * 
 * @author Carlos Bretherton.
 * @version 01 de Mayo del 2012.
 */
public class Pinguino extends Personajes
{
    private boolean ban;
    private int dir;
    
    /**
     * Constructor para crear los objetos de
     * la clase pinguino.
     * @param tipo Tipo de personaje.
     * @param x Posición del personaje en el eje de las x.
     * @param y Posición del personaje en el eje de las y.
     */
    public Pinguino(int tipo, int x, int y)
    {
        super( tipo, x, y );
        ban = false;
    }
    
    /**
     * Actua de los objetos de la clase Pinguino,
     * verifica si el número de vidas es mayor a 0,
     * si el tiempo es menor a 60, si intersecto con
     * un enemigo, si intersecto con una vida, etc; 
     * llama al método avanza para verificar si 
     * se quiere mover el pinguino.
     */
    public void act() 
    {
        super.act();
        
        if(world.vidas > 0 && world.time.t3 < 60)
        {
            if(world.nenemigos == 0)
            {
                world.iniciarNivel();
            }
            else
            {
                if(ban == false)
                {
                    avanza();
                    verificaEnemigo();
                    verificaVida();
                }
                else
                {
                    int px2 = px;
                    int py2 = py;
                    super.mover(dir);
                    if( px2 != px || py2 != py)
                    {
                        ban = false;
                    }
                }
                
                if(Greenfoot.isKeyDown("r"))
                {
                    world.nivel--;
                    world.iniciarNivel();
                }
                
                if(Greenfoot.isKeyDown("escape"))
                {
                    world.removeObject(this);
                    world.removeObjects(world.getObjects(Actor.class));
                    world.menu();
                }
            }
        }
        else
        {
            world.reiniciar();
        }               
    }
    
    /**
     * Verifica si se presiono una tecla de
     * dirección y de acuerdo a la dirección
     * lo mueve llamando al método mover de
     * la superclase, y verifica si al moverse
     * no intersecta con un cubo, de ser asi
     * mueve hacia la misma dirección el cubo.
     */
    public void avanza()
    {
        String tecla = Greenfoot.getKey();
        
        /*
         * Si quiere avanzar a la derecha.
         */
        if(tecla == "right" && px < 14)
        {
            super.mover(RIGHT);
            if(world.Arr[py][px+1] == CUBOFIJO || world.Arr[py][px+1] == CUBOMOV)
            {
                Cubo nuevo = (Cubo)getOneObjectAtOffset(19, 0, Cubo.class);
                if(nuevo != null)
                {
                    nuevo.dir = RIGHT;
                    nuevo.ban = true;
                    ban = true;
                    dir = RIGHT;
                }
            }
        }
        
        /*
         * Si quiere avanzar hacia la izquierda.
         */
        if(tecla == "left" &&  px > 0)
        {
            super.mover(LEFT);
            if(world.Arr[py][px-1] == CUBOFIJO || world.Arr[py][px-1] == CUBOMOV)
            {
                Cubo nuevo = (Cubo)getOneObjectAtOffset(-19, 0, Cubo.class);
                if(nuevo != null)
                {
                    nuevo.dir = LEFT;
                    nuevo.ban = true;
                    ban = true;
                    dir = LEFT;
                }
            }
        }
        
        /*
         * Si quiere avanzar hacia arriba.
         */
        if(tecla == "up" && py > 0)
        {
            super.mover(UP);
            if(world.Arr[py-1][px] == CUBOFIJO || world.Arr[py-1][px] == CUBOMOV)
            {
                Cubo nuevo = (Cubo)getOneObjectAtOffset(0, -19, Cubo.class);
                if(nuevo != null)
                {
                    nuevo.dir = UP;
                    nuevo.ban = true;
                    ban = true;
                    dir = UP;
                }
            }
        }
        
        /*
         *Si quiere avanzar hacia abajo. 
         */
        if(tecla == "down" && py < 14)
        {
            super.mover(DOWN);
            if(world.Arr[py+1][px] == CUBOFIJO || world.Arr[py+1][px] == CUBOMOV)
            {
                Cubo nuevo = (Cubo)getOneObjectAtOffset(0, 19, Cubo.class);
                if(nuevo != null)
                {
                    nuevo.dir = DOWN;
                    nuevo.ban = true;
                    ban = true;
                    dir = DOWN;
                }
            }
        }
        tecla = "a";       
    }
    
    /**
     * Verifica si intersecta con un objeto
     * enemigo, si intersecta llama al método
     * posiciona y le resta una vida.
     */
    public void verificaEnemigo()
    {
        Enemies enemigo = (Enemies)getOneObjectAtOffset(0, 0, Enemies.class);
        if( enemigo != null )
        {
            this.posiciona();
            world.vidas--;
        }
    }
    
    /**
     * Verifica si intersecta con un objeto
     * vida, si intersecta elimina el objeto
     * vida y le suma una vida.
     */
    public void verificaVida()
    {
        Life life = (Life)getOneObjectAtOffset(0, 0, Life.class);
        if( life != null )
        {
            life.destruir();
            world.vidas++;
        }
    }
    
    /**
     * Posiciona al pinguino donde no
     * intersecte con nigun objeto, esto
     * sucede cuando un enemigo alcanza 
     * al pinguino.
     */
    public void posiciona()
    {
        r = new Random();
        int r2 = r.nextInt(15);
        if(world.Arr[r2][r2] == 0)
        {
            px = r2;
            py = r2;
            setLocation(18 + (px*33), 60 + (py*33));
            Personajes aux = (Personajes)getOneObjectAtOffset(0, 0, Personajes.class);
            if(aux != null)
            {
                posiciona();
            }
        }
        else
        {
            posiciona();
        }
    }
}